// 加载项目所需的依赖
const express = require('express');// express 框架文件
const path = require('path');// 路径模块
const ejs = require('ejs'); // 模板引擎
const bodyParser = require('body-parser');// 解析POST请求
const cors = require('cors');// 做资源跨域共享
const createError = require('http-errors');
const cookieParser = require('cookie-parser');
const logger = require('morgan');


// 创建后台应用程序
const app = express();

// 设置模板引擎
app.set('views', path.join(__dirname, 'views'));
// 配置Express 视图引擎
app.engine('html', ejs.__express);
app.set('view engine', 'html');


// 使用中间件 （请求 ---------中间件--------响应）
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

// 解析 application/x-www-form-urlencoded 文档
app.use(bodyParser.urlencoded({ extended: false }))
// 解析  application/json
app.use(bodyParser.json())
// 设置资源跨域共享
app.use(cors());



// 设置路由
// /test   URL  地址
//  req（请求队形啊）,res（响应对象）
app.get('/test', async (req,res)=> {
   res.send('<h1>hello world</h1>')
})

// api  (接口)
// 图片处理接口
app.use('/api/photo', require('./routes/api/photo'))
// 邮箱验证码处理接口
app.use('/api/email', require('./routes/api/email'))
// 用户模块
app.use('/api/user', require('./routes/api/user'))
// 管理员模块
app.use('/api/admin', require('./routes/api/admin'))
// 轮播图模块
app.use('/api/banner', require('./routes/api/banner'))

// 导航分类模块
app.use('/api/classify', require('./routes/api/classify'))

// 文章模块
app.use('/api/article', require('./routes/api/article'))

// 发布领养宠物模块
app.use('/api/pet', require('./routes/api/pet'))

// 收藏宠物模块
app.use('/api/collect', require('./routes/api/collect'))

// 可视化数据统计
app.use('/api/visual', require('./routes/api/visual'))


// web  (网页)

// 设置静态资源
// __dirname  全局变量  ====>  D:\GZ2403\全栈开发\code\blog_server\
app.use(express.static(path.join(__dirname, 'public')));


// 检索 404  请求
app.use(function(req, res, next) {
  next(createError(404));
});

// 服务端异常
app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

// module  模块系统对象
// 把app挂载到系统对象上，以后可以在www这个执行文件中使用
module.exports = app;
